#!/bin/bash
### BEGIN INIT INFO
# Provides:          WowzaMediaServer
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     
# Default-Stop:      
# X-Interactive:     true
# Short-Description: Start/stop Wowza Media Server
### END INIT INFO

##########################################################
#   FIREWALL CABEZZALAN                                  #
#   Guido Accardo <gaccardo@gmail.com>                   #
#                                                        #
##########################################################

##########################################################
# Instrucciones                                          #
##########################################################
# * Para mostrar un mensaje en modo verbose:
#   msg "MENSAJE"
#
# * Para mostrar los puntos en modo NO verbose:
#   dot
#
#   Siempre que se ponga una regla debe tratar de ponerse
# un msg explicando brevemente que se hace en forma de 
# comentario y una llamada a msg en caso de correr el
# script como verbose
##########################################################

##########################################################
#   CONFIGURACIONES INTERNAS ¡¡¡NO MODIFICAR!!!          #
##########################################################
# Ejecutables
T="iptables"
T6="ip6tables"
C="tc"

## Cadena con las IPs habilitadas para navegar
# String with ip able to go out
# Esta va con mack
NAVEGAN_DMZ=$(cat /etc/firewall/fire-dmz)
NAVEGAN_LEVE=$(cat /etc/firewall/fire-allowed_low)
NAVEGAN=$(cat /etc/firewall/fire-allowed)
NAVEGAN_PROXY=$(cat /etc/firewall/fire-allowed_proxy)
NAVEGAN_QUEUE=$(cat /etc/firewall/fire-layer_7)
MINIMOS=$(cat /etc/firewall/fire-allowed_min)

# Mostrar todo
VERBOSE="1"

function msg() {
  if [ "$VERBOSE" = "1" ]; then
    echo "  *" $1
  fi
}

function dot() {
  if [ "$VERBOSE" != "1" ]; then
    echo -n "..."
  fi
}

function blame() {
  fecha=$(date)
  echo "$fecha CABEZZALAN FIREWALL: $1" >> /var/log/syslog
}

if [ "$VERBOSE" = "1" ]; then
  echo "##############################"
  echo "#    FIREWALL CABEZZALAN     #"
  echo "##############################"
fi

##########################################################
#   DEFINICIONES DEL USUARIO                             #
##########################################################
# Puertos NO bloqueados de acceso al servidor externo
PORTS_WAN_ACCEPT_TCP="1194,80"
PORTS_WAN_ACCEPT_UDP="1194"

# Puertos bloqueados de acceso al servidor desde la vpn
QUEXO_VPN_ACCEPT_TCP="22,80,1194"
QUEXO_VPN_ACCEPT_UDP="1194"


# Puertos habilitados desde afuera y hacia afuera para las virtuales
VIR_PORTS_TCP_WAN="53,80"
VIR_PORTS_UDP_WAN="53"

# Interfaces de red
IF_WAN="eth2"    # Internet
IF_LAN="eth0"    # LAN
IF_VIR="venet0"  # Virtuales
IF_DMZ="br0"     # Bridde DMZ
VPN_QUEXO="tun0" # VPN (quexo)
LO="lo"          # Localhost

# MLDONKEY
#ML_PORTS="4662 4672"

# VOIP
VOIP_SERVER="1.2.3.21"

# VPN
IP_VPN_SERVER="10.9.8.1"

#################
#     IPv6      #
#################

# Permits
I6_TCP_PORTS="22 80"
I6_UDP_PORTS=""

$T59593="2001:1291:200:174::2"

case $1 in

start)
	echo -n "Iniciando firewall:"
	echo "1" > /proc/sys/net/ipv4/ip_forward

	# Nuevas Tablas
	# Quienes pasan por el proxy
	$T -N navegan
	$T -N navegan_leve
	$T -N navegan_queue
	$T -N navegan_min
	$T -N ingresan
	$T -N proxy_users -t nat

	# PRUEBA L7
	#$T -A FORWARD -m mark --mark 10 -j DROP

	$T -A FORWARD -j navegan_queue

	for ip in $NAVEGAN_QUEUE; do
		$T -A navegan_queue -i $IF_LAN -o $IF_WAN -s ${ip%|*} -m mac --mac-source ${ip#*|} -j NFQUEUE --queue-num 10
	done

        $T -t mangle -A POSTROUTING -m mark --mark 10 -j DROP

	$T -A INPUT -i $IF_DMZ -p tcp --dport 9102 -j ACCEPT
	$T -A INPUT -i $IF_DMZ -p tcp --dport 9103 -j ACCEPT

	# DEJO PASAR EL MUNDO A LA DMZ pero no dejo que la dmz pasa a la intra
	for ip in $NAVEGAN_DMZ; do
		$T -A FORWARD -s ${ip%|*} -i $IF_DMZ -o $IF_WAN -m mac --mac-source ${ip#*|} -j ACCEPT
		$T -A FORWARD -d ${ip%|*} -o $IF_DMZ -i $IF_WAN -m state --state ESTABLISHED,RELATED -j ACCEPT
		$T -A FORWARD -d ${ip%|*} -o $IF_DMZ -i $IF_WAN -p tcp --match multiport --dports 80,443,53 -j ACCEPT
	done

	# A ver si puedo filtrar por mac y no me mintieron
	#$T -A FORWARD -s 10.0.0.100 -i $IF_DMZ -o $IF_WAN -m mac --mac-source 00:12:34:56:78:9a -j ACCEPT
	#$T -A FORWARD -d 10.0.0.100 -o $IF_DMZ -i $IF_WAN -m state --state ESTABLISHED,RELATED -j ACCEPT

	# Desde la lan a la dmz
	$T -A FORWARD -s 1.2.3.0/24 -d 10.0.0.0/24 -i $IF_LAN -o $IF_DMZ -p tcp --match multiport --dports 22,80,443 -j ACCEPT
	$T -A FORWARD -s 10.0.0.0/24 -d 1.2.3.0/24 -i $IF_DMZ -o $IF_LAN -m state --state ESTABLISHED,RELATED -j ACCEPT

	#$T -A FORWARD -s 10.0.0.100 -i $IF_DMZ -o $VPN_QUEXO -j ACCEPT
	#$T -A FORWARD -d 10.0.0.100 -o $IF_DMZ -i $VPN_QUEXO -j ACCEPT


	# Regla que le pega al proxy
	#$T -A INPUT -p tcp --dport 3128 -j proxy_users

	# Permito reentrada de ping iniciados en la lan
	$T -A INPUT -i $IF_WAN -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT

	# Permito todo trafico en el resto de las venets
	$T -A INPUT -i venet0 -j ACCEPT

	# Todo lo que provenga de localhost, se admite
	$T -A INPUT -i $LO -j ACCEPT

	# Politicas: REJECT
	$T -P INPUT DROP
	$T -P FORWARD DROP

	# Estados permitidos para las conexiones
	# UDP
	$T -A INPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT 

	# TCP
	$T -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT 

	$T -A FORWARD -o $IF_VIR -m state --state ESTABLISHED,RELATED -j ACCEPT
	# Forward para las máquinas virtuales
	# Para la red, acceso full!
	#$T -A FORWARD -o $IF_VIR -j ACCEPT
	#$T -A FORWARD -i $IF_VIR -j ACCEPT

	# Puertos desde y hacia afuera para las virtuales, tcp
	#for port in $VIR_PORTS_TCP_WAN ; do
	#	$T -A FORWARD -i $IF_WAN -o $IF_VIR -p tcp --dport $port -j ACCEPT
	#	$T -A FORWARD -o $IF_WAN -i $IF_VIR -p tcp --dport $port -j ACCEPT
	#done

	$T -A FORWARD -i $IF_WAN -o $IF_VIR -p tcp -m multiport --dports $VIR_PORTS_TCP_WAN -j ACCEPT
	$T -A FORWARD -o $IF_WAN -i $IF_VIR -p tcp -m multiport --dports $VIR_PORTS_TCP_WAN -j ACCEPT

	# SSH DIRECTOS
	# 2222 Asterisk
	#$T -t nat -A PREROUTING -i $IF_WAN -p tcp --dport 2222 -j DNAT --to 1.2.3.23:21

	# Puertos desde y hacia afuera para las virtuales, udp
	#for port in $VIR_PORTS_UDP_WAN ; do
	#	$T -A FORWARD -i $IF_WAN -o $IF_VIR -p udp --dport $port -j ACCEPT
	#	$T -A FORWARD -o $IF_WAN -i $IF_VIR -p udp --dport $port -j ACCEPT
	#done

	$T -A FORWARD -i $IF_WAN -o $IF_VIR -p udp -m multiport --dports $VIR_PORTS_UDP_WAN -j ACCEPT
	$T -A FORWARD -o $IF_WAN -i $IF_VIR -p udp -m multiport --dports $VIR_PORTS_UDP_WAN -j ACCEPT
	
	# Habilito ping desde y hacia afuera para las virutales	
	#$T -A FORWARD -o $IF_WAN -i $IF_VIR -p icmp -j ACCEPT
	#$T -A FORWARD -o $IF_VIR -i $IF_WAN -p icmp -j ACCEPT

	# Entrada desde internet via ssh a la dmz
	#$T -t nat -A PREROUTING -i $IF_WAN -p tcp --dport 22 -j DNAT --to 1.2.3.23:22

	# Forward para ssh por 443
	#$T -t nat -A PREROUTING -i $IF_WAN -p tcp --dport 443 -j REDIRECT --to-port 1194

	# Nat para la red interna
	$T -t nat -A POSTROUTING -o $IF_WAN -j MASQUERADE

	# PING desde el exterior
	#$T -A INPUT -p icmp -j ACCEPT

	$T -A FORWARD -j navegan_min

	# Habilitacion de pcs minimas
	for ip in $MINIMOS ; do
		$T -A INPUT -i $IF_LAN -s $ip -p tcp --dport 80 -j ACCEPT
		$T -A navegan_min -i $IF_LAN -o $IF_WAN -s $ip -p tcp --dport 80 -j ACCEPT
		$T -A navegan_min -o $IF_LAN -i $IF_WAN -d $ip -p tcp --dport 80 -j ACCEPT
	done

	# Log de ssh externo a Kruzkal y red
	$T -A FORWARD -i $IF_WAN -p tcp --dport 22 -j LOG --log-prefix "SSH EXTERNO" --log-level 4
	$T -A INPUT -i $IF_WAN -p tcp --dport 22 -j LOG --log-prefix "SSH EXTERNO Kruzkal" --log-level 4

	# Permito puertos de entrada desde WAN
	#for port in $PORTS_WAN_ACCEPT_TCP ; do
		#$T -A INPUT -p tcp -i $IF_WAN --dport $port -j ACCEPT
	#done

	$T -A INPUT -p tcp -i $IF_WAN -m multiport --dports $PORTS_WAN_ACCEPT_TCP -j ACCEPT

	#for port in $PORTS_WAN_ACCEPT_UDP ; do
	#	$T -A INPUT -p udp -i $IF_WAN --dport $port -j ACCEPT
	#done

	$T -A INPUT -p UDP -i $IF_WAN -m multiport --dports $PORTS_WAN_ACCEPT_UDP -j ACCEPT

	# Permito puertos de entrada desde VPN
	#for port in $QUEXO_VPN_ACCEPT_TCP ; do
	#	$T -A INPUT -p tcp -i $VPN_QUEXO --dport $port -j ACCEPT
	#done

	$T -A INPUT -p tcp -i $VPN_QUEXO -m multiport --dports $QUEXO_VPN_ACCEPT_TCP -j ACCEPT

	#for port in $QUEXO_VPN_ACCEPT_UDP ; do
	#	$T -A INPUT -p udp -i $VPN_QUEXO --dport $port -j ACCEPT
	#done

	$T -A INPUT -p udp -i $VPN_QUEXO -m multiport --dports $QUEXO_VPN_ACCEPT_UDP -j ACCEPT

	# LOG de ssh reincidentes
	for ip in $REJECTS ; do
		$T -A INPUT -i $IF_WAN -s $ip -p tcp --dport 22 -j LOG --log-prefix "<SSH> por $ip" --log-level 4
	done

	# Forward de LAN a VPN
	$T -A FORWARD -i $VPN_QUEXO -o $IF_LAN -j ACCEPT
	$T -A FORWARD -i $IF_LAN -o $VPN_QUEXO -j ACCEPT
        #$T -t nat -A POSTROUTING -d 10.9.8.2 -j SNAT --to-source $IP_VPN_SERVER
	$T -t nat -A POSTROUTING -o $IF_LAN -s 10.10.10.0/24 -d 1.2.3.0/24 -j SNAT --to-source 1.2.3.10
	$T -t nat -A POSTROUTING -o $VPN_QUEXO -d 10.10.10.0/24 -s 1.2.3.0/24 -j SNAT --to-source 10.10.10.1
	
	# Forward LAN a VIRTUALES
	$T -A FORWARD -i $VPN_QUEXO -o $IF_VIR -j ACCEPT
	$T -A FORWARD -i $IF_VIR -o $VPN_QUEXO -j ACCEPT
	
	$T -A FORWARD -j navegan

	# Navegantes habilitados
	for ip in $NAVEGAN ; do
		# Desde maquinas en la red
		#$T -A FORWARD -i $IF_LAN -s ${ip%|*} -m mac --mac-source ${ip#*|} -j ACCEPT
		$T -A navegan -i $IF_LAN -s ${ip%|*} -m mac --mac-source ${ip#*|} -j ACCEPT

		# Hacia maquina en la red
		#$T -A FORWARD -i $IF_WAN -d ${ip%|*} -j ACCEPT
		$T -A navegan -i $IF_WAN -d ${ip%|*} -j ACCEPT
	done

	#$T -A navegan -j RETURN

	$T -A FORWARD -j navegan_leve

	# Navegantes habilitados sin filtro por mac
	for ip in $NAVEGAN_LEVE ; do
		# Desde maquinas en la red
		#$T -A FORWARD -i $IF_VIR -s $ip -j ACCEPT
		$T -A navegan_leve -i $IF_VIR -s $ip -j ACCEPT

		# Hacia maquina en la red
		#$T -A FORWARD -i $IF_WAN -d $ip -j ACCEPT
		$T -A navegan_leve -i $IF_WAN -d $ip -j ACCEPT
	done

	# Obligadas a pasar por el proxy
	#for ip in $NAVEGAN_PROXY ; do	
	#	$T -A proxy_users -p tcp -i $IF_LAN -s $ip --dport 3128 -j ACCEPT
	#	$T -A proxy_users -p tcp -i $IF_LAN -s $ip --dport 68 -j ACCEPT
	#	$T -A proxy_users -p udp -i $IF_LAN -s $ip --dport 68 -j ACCEPT
	#	$T -A FORWARD -p tcp -i $IF_LAN -o $IF_LAN -s $ip -j ACCEPT
	#done

	for ip in $NAVEGAN_PROXY ; do
		$T -t nat -A proxy_users -o $IF_WAN -s $ip -p tcp -m multiport --dports 80,443,8080,443 -j REDIRECT --to-port 3128
	done

	# Input libre para la red interna

	$T -A INPUT -j ingresan

	for ip in $NAVEGAN ; do
		$T -A ingresan -p tcp -i $IF_LAN -s ${ip%|*} -m multiport --dports 22,80,443,5060,9102,9103,9101,137,139,445 -j ACCEPT
		#$T -A ingresan -p udp -i $IF_LAN -s ${ip%|*} -j ACCEPT
		#$T -A INPUT -p tcp -i $IF_LAN -s ${ip%|*} -j ACCEPT
		#$T -A INPUT -p udp -i $IF_LAN -s ${ip%|*} -j ACCEPT
		#$T -A INPUT -p icmp -i $IF_LAN -s ${ip%|*} -j ACCEPT
	done

        # Ver Ips internas desde quexo
	#$T -t nat -A POSTROUTING -s 10.10.10.0/24 -d 1.2.3.0/24 -j SNAT --to-source 1.2.3.10

	# Nagios desde afuera
	$T -t nat -A PREROUTING -i $IF_WAN -p tcp --dport 8080 -j DNAT --to 1.2.3.22

	########
	# VOIP #
	########

	# Conexiones desde afuera al asterisk permitidas 
	$T -t nat -A PREROUTING -i $IF_WAN -p udp --dport 10000:20000 -j DNAT --to-destination $VOIP_SERVER
	$T -t nat -A PREROUTING -i $IF_WAN -p udp --dport 5060        -j DNAT --to-destination $VOIP_SERVER
	$T -t nat -A PREROUTING -i $IF_WAN -p udp --dport 5061        -j DNAT --to-destination $VOIP_SERVER
	
	echo " OK"

	echo -n "Firewall IPv6:"

	#PRUEBA PARA BALANCEO DE CARGA
	#$T -t mangle -A POSTROUTING -o eth2 -s 10.0.0.100 -j CLASSIFY --set-class 1:10
	#$T -t mangle -A FORWARD -o $IF_WAN -i $IF_LAN -s 1.2.3.41 -j CLASSIFY --set-class 1:1
	#$T -t mangle -A FORWARD -i $IF_WAN -o $IF_LAN -d 1.2.3.41 -j CLASSIFY --set-class 1:1
	#$T -t mangle -A FORWARD -o $IF_WAN -j CLASSIFY --set-class 1:2

	#$C qdisc add dev $IF_WAN root handle 1: htb default 1
	#$C class add dev $IF_WAN parent 1: classid 1:1 htb rate 10mbit
	#$C class add dev $IF_WAN parent 1: classid 1:2 htb rate 1mbit

	# Politicas
	$T6 -P INPUT DROP
	$T6 -P FORWARD DROP

	# Conexiones establecidas
	$T6 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
	$T6 -A INPUT -i sixxs -p tcp --dport 22 -j ACCEPT
	$T6 -A INPUT -i sixxs -p all -s 2001:1291:200:174::2 -j ACCEPT

	# Puertos entrantes

	#for port in $I6_TCP_PORTS ; do
#		$T6 -A INPUT -i sixxs -p tcp --dport $port -j ACCEPT
	#done

	echo " OK"

;;

stop)

	echo -n "Deteniendo firewall (IPv4):"
	# Limpieza IPv4
	$T -F
	$T -F -t nat
	$T -F -t mangle
	$T -P FORWARD ACCEPT
	$T -P INPUT ACCEPT
	$T -F navegan
	$T -X navegan
	$T -F navegan_leve
	$T -X navegan_leve
	$T -F navegan_queue
	$T -X navegan_queue
	$T -F ingresan
	$T -X ingresan
	$T -F navegan_min
	$T -X navegan_min
	$T -F proxy_users -t nat
	$T -X proxy_users -t nat
	echo " OK"

	echo -n "Deteniendo firewall (IPv6):"
	# Limpieza IPv6
	$T6 -F
	$T6 -P INPUT ACCEPT
	$T6 -P FORWARD ACCEPT
	echo " OK"

	echo -n "Borrando QoS:"
	#$C qdisc del dev $IF_WAN root
	#$C class del dev $IF_WAN classid 1:1
	#$C class del dev $IF_WAN classid 1:2
	echo " OK"

;;

restart)

	/etc/init.d/firewall stop
	/etc/init.d/firewall start

;;

test)

	echo $((whoami))

;;

*)
	echo "Uso: <start|stop>"
;;

esac	
